import axios from 'axios'
import router from '../router'
import _ from 'lodash'
import qs from 'qs'

import { ElMessage } from 'element-plus'
import 'element-plus/theme-chalk/el-message.css'

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'

// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项，表示请求URL公共部分
  baseURL: import.meta.env.VITE_APP_BASE_API,
  // 超时
  timeout: 10000,
  // 自定义请求头
  headers: { platform: 'web' }
})

// request拦截器
service.interceptors.request.use(
  (config) => {
    // 去除空字符串字段
    if (config.method === 'get' && config.params) {
      // 空字符串字段设置为undefined, 不发送给后台
      for (const propName of Object.keys(config.params)) {
        const value = config.params[propName]
        if (_.isString(value)) {
          config.params[propName] = _.trim(value)
          if (_.isEmpty(config.params[propName])) {
            config.params[propName] = undefined
          }
        }
      }

      // 处理get请求数组不带[]等特殊字符
      config.paramsSerializer = {
        serialize: function (params) {
          return qs.stringify(params, { arrayFormat: 'repeat' })
        }
      }
    }
    return config
  },
  (error) => {
    Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  (res) => {
    // 状态码在200~300之间进入该方法

    // 未设置状态码则默认成功状态
    const code = res.data.code || 500

    // 正常json响应数据
    if (code === 200) {
      return Promise.resolve(res.data)
    }

    // 后台已捕获异常：登录过期
    if (code === 401) {
      needReLogin()
      // TODO console是否可以不打印该异常信息？
      return Promise.reject('会话已过期，请重新登录。')
    }

    // 正常流响应数据
    if (
      res.request.responseType === 'blob' ||
      res.request.responseType === 'arraybuffer'
    ) {
      return { data: res.data, resHeader: res.headers['content-disposition'] }
    }

    // 后台已捕获的异常：其他业务异常
    const msg = '服务异常!异常编号=' + code + ',' + (res.data.msg || '未知异常')
    return Promise.reject(new Error(msg))
  },
  (error) => {
    // 状态码不在200~300之间会进入该方法
    // console.error(error)

    const res = error.response
    const code = res.data.code || 500

    let { message } = error
    // 后台已捕获的异常：参数异常
    if (code === 1400) {
      message = '参数异常：' + res.data.msg || '未知异常'
    } else if (message === 'Network Error') {
      message = '服务网络异常'
    } else if (message.includes('timeout')) {
      message = '服务请求超时'
    } else if (message.includes('Request failed with status code')) {
      message = '服务异常：' + message.substr(message.length - 3)
    }
    ElMessage({
      message: message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

// 是否显示重新登录
const showWhiteList = ['/login']

// export const loginBox = { show: false }
// function showLoginBox() {
//   // console.log(router.currentRoute.value.path)
//   if (
//     !loginBox.show &&
//     showWhiteList.indexOf(router.currentRoute.value.path) === -1
//   ) {
//     loginBox.show = true
//     ElMessageBox.confirm(
//       '登录状态已过期，您可以继续留在该页面，或者重新登录',
//       '系统提示',
//       {
//         confirmButtonText: '重新登录',
//         cancelButtonText: '取消',
//         type: 'warning'
//       }
//     )
//       .then(() => {
//         loginBox.show = false
//         // todo 登录api
//       })
//       .catch(() => {
//         loginBox.show = false
//       })
//   }
// }

import { useAccountStore } from '@/store/account'
function needReLogin() {
  const accountStore = useAccountStore()
  // console.log(accountStore.showLoginForm)
  if (
    !accountStore.showLoginForm &&
    showWhiteList.indexOf(router.currentRoute.value.path) === -1
  ) {
    accountStore.setShowLoginForm(true)
  }
}

export default service
